package org.example.proxy;

import lombok.extern.slf4j.Slf4j;
import net.sf.cglib.proxy.Enhancer;

import java.lang.reflect.Proxy;
@Slf4j
public class Main {
    public static void main(String[] args) {
        //这样进行代理的
        //静态代理，如果再添加一个方法的时候 ，静态就比较麻烦了
        //这时候使用动态代理就比较合适
        //HouseSubject houseSubject = new HouseProxy(new RealHouseSubject());
        //houseSubject.sentHouse();

        //JDK动态代理
        //这是代理一个实现接口的类
        //如果一个类没有实现接口的时候，这时候不能用jdk来进行代理
//        HouseSubject target=new RealHouseSubject();
//        HouseSubject proxy=(HouseSubject) Proxy.newProxyInstance(
//                target.getClass().getClassLoader(),
//                new Class[] {HouseSubject.class},
//                new JDKInvocationHandler(target)
//        );
//        proxy.sentHouse();
        //使用JDK代理一个普通的类
//        RealHouseSubject2 target1=new RealHouseSubject2();
//        RealHouseSubject2 proxy1=(RealHouseSubject2)  Proxy.newProxyInstance(
//                target1.getClass().getClassLoader(),
//                new Class[]{RealHouseSubject2.class},
//                new JDKInvocationHandler(target1)
//        );
//        proxy1.sentHouse();

        //使用cglib动态代理
//        HouseSubject target=new RealHouseSubject();
//        HouseSubject proxy=(HouseSubject) Enhancer.create(
//                target.getClass(),
//                new CGLibMethodInterceptor(target)
//        );
//        proxy.sentHouse();

        //代理普通类
        RealHouseSubject2 target = new RealHouseSubject2();
        RealHouseSubject2 proxy = (RealHouseSubject2) Enhancer.create(
                target.getClass(),
                new CGLibMethodInterceptor(target));
        proxy.sentHouse();
    }
}
